{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RMSProp\n",
    "RMSprop 是由 Geoff Hinton 在他 Coursera 课程中提出的一种适应性学习率方法，至今仍未被公开发表。前面我们提到了 Adagrad 算法有一个问题，就是学习率分母上的变量 s 不断被累加增大，最后会导致学习率除以一个比较大的数之后变得非常小，这不利于我们找到最后的最优解，所以 RMSProp 的提出就是为了解决这个问题。\n",
    "\n",
    "## RMSProp 算法\n",
    "RMSProp 仍然会使用梯度的平方量，不同于 Adagrad，其会使用一个指数加权移动平均来计算这个 s，也就是\n",
    "\n",
    "$$\n",
    "s_i = \\alpha s_{i-1} + (1 - \\alpha) \\ g^2\n",
    "$$\n",
    "\n",
    "这里 g 表示当前求出的参数梯度，然后最终更新和 Adagrad 是一样的，学习率变成了\n",
    "\n",
    "$$\n",
    "\\frac{\\eta}{\\sqrt{s + \\epsilon}}\n",
    "$$\n",
    "\n",
    "这里 $\\alpha$ 是一个移动平均的系数，也是因为这个系数，导致了 RMSProp 和 Adagrad 不同的地方，这个系数使得 RMSProp 更新到后期累加的梯度平方较小，从而保证 s 不会太大，也就使得模型后期依然能够找到比较优的结果\n",
    "\n",
    "实现上和 Adagrad 非常像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def rmsprop(parameters, sqrs, lr, alpha):\n",
    "    eps = 1e-10\n",
    "    for param, sqr in zip(parameters, sqrs):\n",
    "        sqr[:] = alpha * sqr + (1 - alpha) * param.grad.data ** 2\n",
    "        div = lr / torch.sqrt(sqr + eps) * param.grad.data\n",
    "        param.data = param.data - div"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "from torchvision.datasets import MNIST # 导入 pytorch 内置的 mnist 数据\n",
    "from torch.utils.data import DataLoader\n",
    "from torch import nn\n",
    "from torch.autograd import Variable\n",
    "import time\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "def data_tf(x):\n",
    "    x = np.array(x, dtype='float32') / 255\n",
    "    x = (x - 0.5) / 0.5 # 标准化，这个技巧之后会讲到\n",
    "    x = x.reshape((-1,)) # 拉平\n",
    "    x = torch.from_numpy(x)\n",
    "    return x\n",
    "\n",
    "train_set = MNIST('./data', train=True, transform=data_tf, download=True) # 载入数据集，申明定义的数据变换\n",
    "test_set = MNIST('./data', train=False, transform=data_tf, download=True)\n",
    "\n",
    "# 定义 loss 函数\n",
    "criterion = nn.CrossEntropyLoss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, Train Loss: 0.363507\n",
      "epoch: 1, Train Loss: 0.161640\n",
      "epoch: 2, Train Loss: 0.120954\n",
      "epoch: 3, Train Loss: 0.101136\n",
      "epoch: 4, Train Loss: 0.085934\n",
      "使用时间: 58.86966 s\n"
     ]
    }
   ],
   "source": [
    "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
    "# 使用 Sequential 定义 3 层神经网络\n",
    "net = nn.Sequential(\n",
    "    nn.Linear(784, 200),\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(200, 10),\n",
    ")\n",
    "\n",
    "# 初始化梯度平方项\n",
    "sqrs = []\n",
    "for param in net.parameters():\n",
    "    sqrs.append(torch.zeros_like(param.data))\n",
    "    \n",
    "# 开始训练\n",
    "losses = []\n",
    "idx = 0\n",
    "start = time.time() # 记时开始\n",
    "for e in range(5):\n",
    "    train_loss = 0\n",
    "    for im, label in train_data:\n",
    "        im = Variable(im)\n",
    "        label = Variable(label)\n",
    "        # 前向传播\n",
    "        out = net(im)\n",
    "        loss = criterion(out, label)\n",
    "        # 反向传播\n",
    "        net.zero_grad()\n",
    "        loss.backward()\n",
    "        rmsprop(net.parameters(), sqrs, 1e-3, 0.9) # 学习率设为 0.001，alpha 设为 0.9\n",
    "        # 记录误差\n",
    "        train_loss += loss.data[0]\n",
    "        if idx % 30 == 0:\n",
    "            losses.append(loss.data[0])\n",
    "        idx += 1\n",
    "    print('epoch: {}, Train Loss: {:.6f}'\n",
    "          .format(e, train_loss / len(train_data)))\n",
    "end = time.time() # 计时结束\n",
    "print('使用时间: {:.5f} s'.format(end - start))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x106998470>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\ngg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10c138cf8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_axis = np.linspace(0, 5, len(losses), endpoint=True)\n",
    "plt.semilogy(x_axis, losses, label='alpha=0.9')\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, Train Loss: 0.471134\n",
      "epoch: 1, Train Loss: 0.188616\n",
      "epoch: 2, Train Loss: 0.148085\n",
      "epoch: 3, Train Loss: 0.124590\n",
      "epoch: 4, Train Loss: 0.107619\n",
      "使用时间: 70.13240 s\n"
     ]
    }
   ],
   "source": [
    "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
    "# 使用 Sequential 定义 3 层神经网络\n",
    "net = nn.Sequential(\n",
    "    nn.Linear(784, 200),\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(200, 10),\n",
    ")\n",
    "\n",
    "# 初始化梯度平方项\n",
    "sqrs = []\n",
    "for param in net.parameters():\n",
    "    sqrs.append(torch.zeros_like(param.data))\n",
    "    \n",
    "# 开始训练\n",
    "losses = []\n",
    "idx = 0\n",
    "\n",
    "start = time.time() # 记时开始\n",
    "for e in range(5):\n",
    "    train_loss = 0\n",
    "    for im, label in train_data:\n",
    "        im = Variable(im)\n",
    "        label = Variable(label)\n",
    "        # 前向传播\n",
    "        out = net(im)\n",
    "        loss = criterion(out, label)\n",
    "        # 反向传播\n",
    "        net.zero_grad()\n",
    "        loss.backward()\n",
    "        rmsprop(net.parameters(), sqrs, 1e-3, 0.999) # 学习率设为 0.001，alpha 设为 0.999\n",
    "        # 记录误差\n",
    "        train_loss += loss.data[0]\n",
    "        if idx % 30 == 0:\n",
    "            losses.append(loss.data[0])\n",
    "        idx += 1\n",
    "    print('epoch: {}, Train Loss: {:.6f}'\n",
    "          .format(e, train_loss / len(train_data)))\n",
    "end = time.time() # 计时结束\n",
    "print('使用时间: {:.5f} s'.format(end - start))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x10c160d68>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x111284f28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_axis = np.linspace(0, 5, len(losses), endpoint=True)\n",
    "plt.semilogy(x_axis, losses, label='alpha=0.999')\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**小练习：可以看到使用了不同的 alpha 会使得 loss 在下降过程中的震荡程度不同，想想为什么**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当然 pytorch 也内置了 rmsprop 的方法，非常简单，只需要调用 `torch.optim.RMSprop()` 就可以了，下面是例子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, Train Loss: 0.372473\n",
      "epoch: 1, Train Loss: 0.164288\n",
      "epoch: 2, Train Loss: 0.122384\n",
      "epoch: 3, Train Loss: 0.100739\n",
      "epoch: 4, Train Loss: 0.088391\n",
      "使用时间: 85.15531 s\n"
     ]
    }
   ],
   "source": [
    "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
    "# 使用 Sequential 定义 3 层神经网络\n",
    "net = nn.Sequential(\n",
    "    nn.Linear(784, 200),\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(200, 10),\n",
    ")\n",
    "\n",
    "optimizer = torch.optim.RMSprop(net.parameters(), lr=1e-3, alpha=0.9)\n",
    "    \n",
    "# 开始训练\n",
    "\n",
    "start = time.time() # 记时开始\n",
    "for e in range(5):\n",
    "    train_loss = 0\n",
    "    for im, label in train_data:\n",
    "        im = Variable(im)\n",
    "        label = Variable(label)\n",
    "        # 前向传播\n",
    "        out = net(im)\n",
    "        loss = criterion(out, label)\n",
    "        # 反向传播\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        # 记录误差\n",
    "        train_loss += loss.data[0]\n",
    "    print('epoch: {}, Train Loss: {:.6f}'\n",
    "          .format(e, train_loss / len(train_data)))\n",
    "end = time.time() # 计时结束\n",
    "print('使用时间: {:.5f} s'.format(end - start))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mx",
   "language": "python",
   "name": "mx"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
